#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <stdarg.h>
#include <assert.h>
#include <ctype.h>

#include <string>
#include "ILexer.h"
#include "Scintilla.h"
#include "SciLexer.h"
#include "PropSetSimple.h"
#include "WordList.h"
#include "LexAccessor.h"
#include "Accessor.h"
#include "LexerModule.h"
#include "LexerBase.h"
#include "LexerSimple.h"

#ifdef SCI_NAMESPACE
using namespace Scintilla;
#endif

LexerSimple::LexerSimple( const LexerModule *module_ ) : module( module_ ) {
  for( int wl = 0; wl < module->GetNumWordLists(); wl++ ) {
    if( !wordLists.empty() ) {
      wordLists += "\n";
    }
    wordLists += module->GetWordListDescription( wl );
  }
}

const char *  LexerSimple::DescribeWordListSets() {
  return wordLists.c_str();
}

void  LexerSimple::Lex( unsigned int startPos, int lengthDoc, int initStyle, IDocument *pAccess ) {
  Accessor astyler( pAccess, &props );
  module->Lex( startPos, lengthDoc, initStyle, keyWordLists, astyler );
  astyler.Flush();
}

void  LexerSimple::Fold( unsigned int startPos, int lengthDoc, int initStyle, IDocument *pAccess ) {
  if( props.GetInt( "fold" ) ) {
    Accessor astyler( pAccess, &props );
    module->Fold( startPos, lengthDoc, initStyle, keyWordLists, astyler );
    astyler.Flush();
  }
}
